#pragma once

#include "Common.h"
#include "CzechMoveGen.h"
#include "InternationalMoveGen.h"
#include "EnglishMoveGen.h"


// initalization function
void InitMoveGen();

// template specialization for move generators
template<typename TBITBOARD> int MoveGenerator(SEngineData* ed, TBITBOARD* bb, bool bWhite, TBITBOARD* movelist); 
template<> int MoveGenerator<BitBoard>(SEngineData* ed, BitBoard* bb, bool bWhite, BitBoard* movelist); 
template<> int MoveGenerator<BitBoard64>(SEngineData* ed, BitBoard64* bb, bool bWhite, BitBoard64* movelist); 

// template specialization for TestJump function
template<typename TBITBOARD> bool TestJump(SEngineData* ed, TBITBOARD* bb, bool bWhite);
template<> bool TestJump<BitBoard>(SEngineData* ed, BitBoard* bb, bool bWhite);
template<> bool TestJump<BitBoard64>(SEngineData* ed, BitBoard64* bb, bool bWhite);

// template specialization for ToggleMove function
template<typename TBITBOARD> void ToggleMove(TBITBOARD* bb, TBITBOARD* bbMove);
template<> void ToggleMove<BitBoard>(BitBoard* bb, BitBoard* bbMove);
template<> void ToggleMove<BitBoard64>(BitBoard64* bb, BitBoard64* bbMove);

// sets the checkers type
void SetCheckersTypeMoveGen(SEngineData* ed, eCheckersType type);
